package cn.tedu.reflection;/**
 * @Author 金帮嘉诚 @Date 2021-06-24 星期四 16:19
 */
/*本类用于测试反射1*/

import org.junit.Test;

import java.lang.reflect.Constructor;
import java.util.Arrays;

/**
 * 知识点
 * 获取字节码对象的三种方式
 * Class.forName("类的全路径名") 全路径名从包名开始
 * 类名.class
 * 对象.getClass
 * 字节码对象的方法的使用
 * .getName()
 * .getPackage().getName()
 * .getSimpleName()
 */
public class TestReflect1 {
    /*单元测试方法：是java测试的最小单位，使用灵活，推荐指数五颗星※※※※※
     * 语法要求：@Test + void + 没有参数 + public
     * 注意：使用时需要导包：Add Junit4 to classPath
     * import org.junit.Test*/

    //谐音
    @Test
    public void getClazz() throws Exception {
        //本方法的参数是 目标类的全路径名（报名+类名）
        Class<?> student1 = Class.forName("cn.tedu.reflection.Student");
        Class<?> student2 = Student.class;
        //本方法创建一个匿名对象，匿名对象没有名字
        Class<?> student3 = new Student().getClass();

        //class cn.tedu.reflection.Student
        System.out.println(student1);

        //cn.tedu.reflection.Student
        System.out.println(student1.getName());

        //cn.tedu.reflection
        System.out.println(student1.getPackage().getName());

        //Student
        System.out.println(student1.getSimpleName());

    }

    //获取构造方法
    @Test
    public void getConstructor() {
        Class<?> clazz = Student.class;
//        Constructor<?> constructor = clazz.getConstructor();
        Constructor<?>[] cs = clazz.getConstructors();
        //循环获取
        //
        for (Constructor<?> c : cs
        ) {
            System.out.println(c.getName());
            Class[] cp = c.getParameterTypes();//获取参数类型 可能多个
            System.out.println(Arrays.toString(cp));
        }
    }
}
//同类同包子类不同包
